#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 最大订单数
#define MAX_ORDERS 20
// 最大菜品数
#define MAX_DISHES 4
// 用户模块开关（1-启用，0-关闭）
#define USER_MODULE 0
// 固定送餐费
#define DELIVERY_FEE 5.0 

// 订单状态枚举
typedef enum {
    STATUS_PENDING,    // 未签收
    STATUS_COMPLETED   // 已完成
} OrderStatus;

// 订单结构体
typedef struct {
    int id;
    char dish[20];
    float price;
    int quantity;       // 新增：份数
    float totalPrice;   // 新增：总费用
    char customerName[20]; // 新增：订餐人姓名
    char address[50];
    int deliveryTime;   // 新增：送餐时间（整点）
    OrderStatus status;
#if USER_MODULE
    char user[20];      // 用户名（用户模块启用时有效）
#endif
} Order;

// 菜品结构体
typedef struct {
    char name[20];      // 菜品名称
    float price;        // 价格
    int likes;          // 点赞数
} Dish;

// 全局变量
Order orders[MAX_ORDERS]; // 订单数组
Dish dishes[MAX_DISHES] = { // 初始化菜品
    {"黄焖只因", 25.0, 0},
    {"鱼香肉丝", 20.0, 0},
    {"麻婆豆腐", 10.0, 0},
    {"清炒土豆丝", 8.0, 0}
};
int orderCount = 0;      // 当前订单数

#if USER_MODULE
// 用户结构体及权限控制（简化实现）
typedef struct {
    char username[20];
    char password[20];
    int isAdmin; // 1-管理员，0-普通用户
} User;
User users[10] = { {"admin", "admin123", 1} }; // 预设管理员
int userCount = 1;
User* currentUser = NULL;
#endif

// 函数声明
void showMainMenu();
void placeOrder();
void viewOrders();
void confirmOrder();
void deleteOrder();
void likeDish();
#if USER_MODULE
void login();
#endif

// 主函数
int main() {
#if USER_MODULE
    login(); // 用户登录
#else
    system("cls"); // 清屏（Windows）
#endif

    int choice;
    do {
        showMainMenu();
        scanf("%d", &choice);
        switch (choice) {
        case 1: placeOrder(); break;
        case 2: viewOrders(); break;
        case 3: confirmOrder(); break;
        case 4: deleteOrder(); break;
        case 5: likeDish(); break;
        case 6: printf("感谢使用，再见！\n"); break;
        default: printf("无效选项，请重新输入！\n");
        }
    } while (choice != 6);

    return 0;
}

// 显示主菜单
void showMainMenu() {
    printf("\n*******************************\n");
    printf("欢迎使用【吃了吗订餐系统】\n");
    printf("*******************************\n");
    printf("1、我要订餐\n");
    printf("2、查看餐袋\n");
    printf("3、签收订单\n");
    printf("4、删除订单\n");
    printf("5、我要点赞\n");
    printf("6、退出系统\n");
    printf("*******************************\n");
    printf("请选择：");
}

// 订餐功能
void placeOrder() {
    if (orderCount >= MAX_ORDERS) {
        printf("今日订单已满！\n");
        return;
    }

    printf("\n*** 我要订餐 ***\n");

    // 输入订餐人姓名
    char name[20];
    printf("请输入订餐人姓名：");
    scanf("%s", name);

    // 显示菜单
    printf("序号\t菜名\t\t单价\t点赞数\n");
    for (int i = 0; i < MAX_DISHES; i++) {
        printf("%d\t%s\t%.1f元\t%d赞\n", i + 1, dishes[i].name, dishes[i].price, dishes[i].likes);
    }

    // 选择菜品
    int dishId;
    printf("请选择菜品编号：");
    if (scanf("%d", &dishId) != 1 || dishId < 1 || dishId > MAX_DISHES) {
        printf("无效的菜品编号！\n");
        while (getchar() != '\n'); // 清空输入缓冲区
        return;
    }

    // 输入份数
    int quantity;
    printf("请选择需要的份数：");
    if (scanf("%d", &quantity) != 1 || quantity <= 0) {
        printf("份数必须大于0！\n");
        while (getchar() != '\n');
        return;
    }

    // 输入送餐时间
    int time;
    printf("请输入送餐时间（10-20点整点）：");
    if (scanf("%d", &time) != 1 || time < 10 || time > 20) {
        printf("无效的送餐时间！\n");
        while (getchar() != '\n');
        return;
    }

    // 输入地址
    char address[50];
    printf("请输入送餐地址：");
    scanf("%s", address);

    // 计算总费用
    float total = (dishes[dishId - 1].price * quantity) + DELIVERY_FEE;

    // 保存订单
    Order newOrder = {
        .id = orderCount + 1,
        .quantity = quantity,
        .totalPrice = total,
        .deliveryTime = time,
        .status = STATUS_PENDING
    };
    strcpy(newOrder.customerName, name);
    strcpy(newOrder.dish, dishes[dishId - 1].name);
    strcpy(newOrder.address, address);
    newOrder.price = dishes[dishId - 1].price; // 记录单价

    orders[orderCount++] = newOrder;

    // 打印订单详情
    printf("\n订餐成功！\n");
    printf("您订的是：%s %d份\n", dishes[dishId - 1].name, quantity);
    printf("送餐时间：%d时\n", time);
    printf("餐费：%.1f元，送餐费%.1f元，总计：%.1f元\n",
        dishes[dishId - 1].price * quantity,
        DELIVERY_FEE,
        total);
    printf("输入0返回：");
    int dummy;
    scanf("%d", &dummy); // 等待用户输入
}

// 查看订单
void viewOrders() {
    printf("\n*** 查看餐袋 ***\n");
    if (orderCount == 0) {
        printf("暂无订单！\n");
        return;
    }

    printf("编号\t订餐人\t菜品\t份数\t总价\t时间\t状态\t地址\n");
    for (int i = 0; i < orderCount; i++) {
        printf("%d\t%s\t%s\t%d\t%.1f元\t%d时\t%s\t%s\n",
            orders[i].id,
            orders[i].customerName,
            orders[i].dish,
            orders[i].quantity,
            orders[i].totalPrice,
            orders[i].deliveryTime,
            orders[i].status == STATUS_PENDING ? "未签收" : "已完成",
            orders[i].address);
    }
}


// 签收订单
void confirmOrder() {
    printf("\n***签收订单***\n");
    int orderId;
    printf("请输入订单编号：");
    scanf("%d", &orderId);

    for (int i = 0; i < orderCount; i++) {
        if (orders[i].id == orderId) {
            if (orders[i].status == STATUS_COMPLETED) {
                printf("订单已签收！\n");
            }
            else {
                orders[i].status = STATUS_COMPLETED;
                printf("签收成功！\n");
            }
            return;
        }
    }
    printf("订单不存在！\n");
}

// 删除订单
void deleteOrder() {
    printf("\n***删除订单***\n");
    int orderId;
    printf("请输入要删除的订单编号：");
    scanf("%d", &orderId);

    for (int i = 0; i < orderCount; i++) {
        if (orders[i].id == orderId) {
            if (orders[i].status != STATUS_COMPLETED) {
                printf("订单未签收，不能删除！\n");
                return;
            }

            // 将后续订单前移
            for (int j = i; j < orderCount - 1; j++) {
                orders[j] = orders[j + 1];
            }
            orderCount--;
            printf("删除成功！\n");
            return;
        }
    }
    printf("订单不存在！\n");
}

// 点赞功能
void likeDish() {
    printf("\n***我要点赞***\n");
    printf("序号\t菜名\t\t单价\t点赞数\n");
    for (int i = 0; i < MAX_DISHES; i++) {
        printf("%d\t%s\t%.1f元\t%d赞\n", i + 1, dishes[i].name, dishes[i].price, dishes[i].likes);
    }

    int dishId;
    printf("请选择要点赞的菜品序号：");
    scanf("%d", &dishId);
    if (dishId < 1 || dishId > MAX_DISHES) {
        printf("无效的菜品序号！\n");
        return;
    }

    dishes[dishId - 1].likes++;
    printf("点赞成功！\n");

    // 按点赞数排序（冒泡排序）
    for (int i = 0; i < MAX_DISHES - 1; i++) {
        for (int j = 0; j < MAX_DISHES - 1 - i; j++) {
            if (dishes[j].likes < dishes[j + 1].likes) {
                Dish temp = dishes[j];
                dishes[j] = dishes[j + 1];
                dishes[j + 1] = temp;
            }
        }
    }
}

#if USER_MODULE
// 用户登录（简化实现）
void login() {
    char username[20], password[20];
    int attempts = 0;

    while (attempts < 3) {
        printf("\n***用户登录***\n");
        printf("用户名：");
        scanf("%s", username);
        printf("密码：");
        scanf("%s", password);

        for (int i = 0; i < userCount; i++) {
            if (strcmp(users[i].username, username) == 0 &&
                strcmp(users[i].password, password) == 0) {
                currentUser = &users[i];
                printf("登录成功！\n");
                return;
            }
        }
        printf("用户名或密码错误！剩余尝试次数：%d\n", 2 - attempts);
        attempts++;
    }
    printf("登录失败，系统退出！\n");
    exit(0);
}
#endif